home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 073 < prev    next >
Internet Message Format  |  1997-05-06  |  34KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-073
  3. Date: Sun, 4 Dec 1994 15:53:28 +0100 (MET)
  4.  
  5. C.S.M.P. Digest             Sun, 04 Dec 94       Volume 3 : Issue 73
  6.  
  7. Today's Topics:
  8.  
  9.         ? THINK Pascal: calling code
  10.         Any science to segmenting?
  11.         Plug-Ins w- CFM
  12.         Saving a PICT to a file - how?
  13.         Sprite Animation Toolkit 2.3a1
  14.         UPP's & calling completion procs
  15.  
  16.  
  17.  
  18. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  19. (pottier@clipper.ens.fr).
  20.  
  21. The digest is a collection of article threads from the internet newsgroup
  22. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  23. regularly and want an archive of the discussions.  If you don't know what a
  24. newsgroup is, you probably don't have access to it.  Ask your systems
  25. administrator(s) for details.  If you don't have access to news, you may
  26. still be able to post messages to the group by using a mail server like
  27. anon.penet.fi (mail help@anon.penet.fi for more information).
  28.  
  29. Each issue of the digest contains one or more sets of articles (called
  30. threads), with each set corresponding to a 'discussion' of a particular
  31. subject.  The articles are not edited; all articles included in this digest
  32. are in their original posted form (as received by our news server at
  33. nef.ens.fr).  Article threads are not added to the digest until the last
  34. article added to the thread is at least two weeks old (this is to ensure that
  35. the thread is dead before adding it to the digest).  Article threads that
  36. consist of only one message are generally not included in the digest.
  37.  
  38. The digest is officially distributed by two means, by email and ftp.
  39.  
  40. If you want to receive the digest by mail, send email to listserv@ens.fr
  41. with no subject and one of the following commands as body:
  42.     help                        Sends you a summary of commands
  43.     subscribe csmp-digest Your Name    Adds you to the mailing list
  44.     signoff csmp-digest            Removes you from the list
  45. Once you have subscribed, you will automatically receive each new
  46. issue as it is created.
  47.  
  48. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  49. Questions related to the ftp site should be directed to
  50. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  51. digest are available there.
  52.  
  53. Also, the digests are available to WAIS users.  To search back issues
  54. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  55. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  56.  
  57.  
  58. -------------------------------------------------------
  59.  
  60. >From ase@cyberspace.org (Ashley A Thomas)
  61. Subject: ? THINK Pascal: calling code
  62. Date: Fri, 18 Nov 1994 16:51:15 +1100
  63. Organization: little to none
  64.  
  65. Could someone tell me where to find a good desription of how to write and
  66. use code you call from inside your program with THINK Pascal in the same
  67. way C programs can by calling a routine by passing a pointer to it.
  68.  
  69. e.g. running code in a resource given its handle (like dnr); or passing a
  70. pointer to a procedure to be called somewhere else.
  71.  
  72. Thanks!
  73. ASE
  74.  
  75. -- 
  76.  
  77. Ashley A Thomas
  78. Email: ase@cyberspace.org
  79.  
  80. +++++++++++++++++++++++++++
  81.  
  82. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  83. Date: 20 Nov 1994 12:59:59 GMT
  84. Organization: (none)
  85.  
  86. ase@cyberspace.org (Ashley A Thomas) writes:
  87.  
  88. >Could someone tell me where to find a good desription of how to write and
  89. >use code you call from inside your program with THINK Pascal in the same
  90. >way C programs can by calling a routine by passing a pointer to it.
  91.  
  92. >e.g. running code in a resource given its handle (like dnr); or passing a
  93. >pointer to a procedure to be called somewhere else.
  94.  
  95. The following inline function is taken from TransSkel.p:
  96.  
  97.     procedure CallpInt (myInt: integer; myProc: ProcPtr);
  98.  
  99. { Two calls use integer as one parameter arguments.  This procedure handles    }
  100. { both of them.                                                                            }
  101.  
  102.     inline
  103.         $205f,     {movea.l  (a7)+,a0        ; (a0) is a ptr to string, 4(a0) is mode}
  104.         $4e90;
  105.  
  106.  
  107. By calling CallpInt, you call the procedure that myProc points to, with myInt
  108. as argument. Unfortunately, there is no type-checking done, so you are
  109. responsible for sending a pointer to a procedure that takes exactly the
  110. arguments you assume.
  111.  
  112. myProc can be created by taking the address of the procedure (e.g.
  113. myProc := @MyProcedure;), or by dereferencing a handle to a code resource
  114. (after locking it!), e.g. something like:
  115.  
  116. myCode := GetResource('CODE', 9999);
  117. if myCode = nil then
  118.     HandleError
  119. else begin
  120.     HLock(myCode);
  121.     myProc := myCode^;
  122. end;
  123.  
  124. You can change the above inline to any other argument list simply by adding
  125. or replacing arguments.
  126.  
  127. Calling procedure pointers should really be built-in into Pascal, just as it
  128. is in Modula2, so we didn't have to do this kind of workarounds. Most of all,
  129. I want type checking on my procedure pointers. Perhaps we could convince
  130. MetroWerks to add it?
  131.  
  132. --
  133. - -
  134. Ingemar Ragnemalm, PhD
  135. Image processing, Mac shareware games
  136. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  137.  
  138. ---------------------------
  139.  
  140. >From ikb_macd@ece.concordia.ca (Keith MacDonald)
  141. Subject: Any science to segmenting?
  142. Date: 8 Nov 1994 04:23:04 GMT
  143. Organization: ECE - Concordia University
  144.  
  145.  
  146. Should I be practising any science in determining which procedures are
  147. grouped into the same segments when I code or is there little/no
  148. overhead in jumping from one segment to another?
  149.  
  150. Cheers,
  151. Keith
  152. ___________________________________________________________________________
  153.  Keith MacDonald                                       Computer Engineering
  154.  ikb_macd@ECE.concordia.ca                             Concordia University
  155.  http://www.ece.concordia.ca/~ikb_macd/addr.html       Montreal, QC, Canada
  156.  
  157. +++++++++++++++++++++++++++
  158.  
  159. >From nick+@pitt.edu ( nick.c )
  160. Date: Tue, 08 Nov 1994 01:05:54 -0500
  161. Organization: The Pitt, Chemistry
  162.  
  163. In article <39muf8$9mu@newsflash.concordia.ca>, ikb_macd@ece.concordia.ca
  164. (Keith MacDonald) wrote:
  165.  
  166. > Should I be practising any science in determining which procedures are
  167. > grouped into the same segments when I code or is there little/no
  168. > overhead in jumping from one segment to another?
  169.  
  170.    My understanding is a segment is swapped into memory as a whole.
  171.      So, (and I'm reasoning here, not speaking with any authority)
  172.      it would make sense to me to group functions that call each
  173.      other together into the same segment.  Try and make each segment
  174.      as "self contained" as possible (realizing that no segment
  175.      could be entirely self contained - or it would be unnecessary
  176.      to 'main').  This would minimize the efficiency loss of swapping
  177.      in segments.  'Course with the modern memory structure of the
  178.      Mac, I'm not sure this "swapping" ocurrs any longer... dunno.
  179.  
  180.  
  181.  Internet: nick+@pitt.edu            _/   _/  _/  _/_/_/   _/   _/  
  182.    eWorld: nick                     _/_/ _/  _/  _/   _/  _/_/_/ 
  183.       CIS: 71232,766               _/ _/_/  _/  _/       _/ _/    
  184.      http://www.pitt.edu/~nick/   _/   _/  _/   _/_/_/  _/   _/     
  185.                     
  186.  
  187. +++++++++++++++++++++++++++
  188.  
  189. >From ramer@nrc.uab.edu (Kevin W. Ramer)
  190. Date: Wed, 09 Nov 1994 09:07:44 -0600
  191. Organization: University of Alabama at Birmingham
  192.  
  193. In article <nick+-0811940105540001@ehdup-f-1.slip.net.pitt.edu>,
  194. nick+@pitt.edu ( nick.c ) wrote:
  195. > > Should I be practising any science in determining which procedures are
  196. > > grouped into the same segments ?
  197.  
  198. >    My understanding is a segment is swapped into memory as a whole.
  199. >      So, (and I'm reasoning here, not speaking with any authority)
  200. >      it would make sense to me to group functions that call each
  201. >      other together into the same segment.  Try and make each segment
  202. >      as "self contained" as possible (realizing that no segment
  203. >      could be entirely self contained - or it would be unnecessary
  204. >      to 'main').  This would minimize the efficiency loss of swapping
  205. >      in segments.  'Course with the modern memory structure of the
  206. >      Mac, I'm not sure this "swapping" ocurrs any longer... dunno.
  207.  
  208. A couple of additional points to be made are 1) if you wish to have 
  209. segments  unloaded, do so from the main segment. Typically, calling 
  210. UnloadSeg each time through your event loop.  2) If you don't stick
  211. to 1 be sure to never unload segments earlier in the calling chain !
  212. For example, main calls A which calls B (each in different segments)
  213. _do not_ UnloadSeg(A) while in B.  Makes for nasty crashes.
  214.  
  215. -- 
  216. Kevin W. Ramer                   ramer@nrc.uab.edu
  217. Programmer Analyst
  218. Neurobiology Research Center
  219. University of Alabama at Birmingham
  220.  
  221. +++++++++++++++++++++++++++
  222.  
  223. >From pgontier@novell.com (Pete Gontier)
  224. Date: Wed, 09 Nov 1994 09:42:45 -0800
  225. Organization: Novell, Inc., Walnut Creek/Macintosh Site
  226.  
  227. In article <nick+-0811940105540001@ehdup-f-1.slip.net.pitt.edu>,
  228. nick+@pitt.edu ( nick.c ) wrote:
  229.  
  230. > 'Course with the modern memory structure of the
  231. > Mac, I'm not sure this "swapping" ocurrs any longer... dunno.
  232.  
  233. Yes, it does. The Modern Memory Manager just has better (read: faster)
  234. heap management. It doesn't try to tell anyone what to do with individual
  235. heap blocks, which of course are what contain each code segment. You may
  236. be thinking of the Power Mac code model, which has a new paging scheme for
  237. code fragments in the data fork, assuming VM is turned on.
  238.  
  239. I might as well add, now that I have followed up, that a successful
  240. segmentation strategy has to be planned ahead of time. The good news is
  241. that the strategy has a lot in common with good engineering practice
  242. regardless of segmentation, so if you are a good engineering citizen, you
  243. probably *accidentally* planned your segmentation strategy ahead of time
  244. :-). More specifically, if you have narrow entry points into your
  245. functional sub-systems, you can simply put each sub-system into its own
  246. segment and unload it when it's not needed.
  247.  
  248. -- 
  249.  The views expressed here do not necessarily reflect those of my employer.
  250.  
  251. +++++++++++++++++++++++++++
  252.  
  253. >From Rick_Holzgrafe@taligent.com (Rick Holzgrafe)
  254. Date: Tue, 8 Nov 1994 18:41:38 GMT
  255. Organization: Semicolon Software
  256.  
  257. In article <39muf8$9mu@newsflash.concordia.ca>, ikb_macd@ece.concordia.ca
  258. (Keith MacDonald) wrote:
  259.  
  260. > Should I be practising any science in determining which procedures are
  261. > grouped into the same segments when I code or is there little/no
  262. > overhead in jumping from one segment to another?
  263.  
  264. Segments exist mainly for memory management purposes: they allow you to
  265. group relevant portions of your code into chunks which do not have to be
  266. kept in memory when they are not in use. For example, your initialization
  267. code runs only once, when the app starts up: put it all into a segment,
  268. and unload it when initialization is complete. You may have printing code
  269. which can be cleanly separated from the rest of your code; there's no need
  270. for it to be in memory when the user isn't printing -- and so on. This
  271. makes more efficient use of your heap and allows your app to run in less
  272. memory.
  273.  
  274. There is a slight performance hit when making calls across segments,
  275. because they must pass through the jump table. Normally it's not worth
  276. worrying about, but I wouldn't call segment B from inside a tight, long,
  277. hopefully-fast loop in segment A. If you segment your code functionally,
  278. this will generally not happen anyway.
  279.  
  280. You should be aware that segments are loaded automagically the first time
  281. any function in them is called, but they are never unloaded unless you do
  282. so specifically in your code. This has a couple of effects. One effect is
  283. that *any* routine can move memory if it is in an unloaded segment when
  284. you call it, because its segment will be loaded into your heap before the
  285. routine can be called. Another effect is that you need to be intelligent
  286. about unloading your segments if you want to reap the memory-management
  287. benefits. A common practice is to keep your main event loop in segment 0
  288. (that is, the one that contains your main routine), and each time through
  289. the event loop, unload every other segment you've got. Unloading a segment
  290. doesn't force it from memory, it just frees it to move in the heap and to
  291. be purged if needed when memory gets low. Commonly used segments will
  292. therefore incur no serious performance penalty from being repeatedly
  293. unloaded unless memory is low; the user can then improve performance by
  294. allocating more memory to the app, if more memory is available.
  295.  
  296. Exceptions to the automagical loading of segments: returns from
  297. subroutines do *not* force loading of segments, and segments cannot be
  298. loaded at interrupt level. Never unload a segment if your call stack
  299. contains pointers into it, or if you are using interrupt-level callbacks
  300. (e.g. from VBL or slot queues, async sound calls, async network calls, and
  301. the like) to routines in the segment. (I got into trouble once by calling
  302. my main event handler from a routine in a different segment; the main
  303. event handler was innocently unloading the segment that called it.
  304. Intermittently [whenever something stirred up the heap just wrong] it
  305. would crash when trying to return to the unloaded segment.)
  306.  
  307. Segments can be marked "preload" in the resource fork if you want them
  308. loaded at startup; if you never explicitly unload them, then they'll
  309. always be there when you need them.
  310.  
  311. Hope this helps.
  312.  
  313. -- Rick Holzgrafe, a member of the Taligentsia
  314.    Rick_Holzgrafe@taligent.com
  315.    rmh@taligent.com
  316.  
  317. +++++++++++++++++++++++++++
  318.  
  319. >From curreyr@halcyon.halcyon.com (curreyr)
  320. Date: 19 Nov 1994 10:16:54 GMT
  321. Organization: Northwest Nexus Inc.
  322.  
  323. In article <Rick_Holzgrafe-0811941041380001@ricks-cafe.taligent.com>
  324. Rick_Holzgrafe@taligent.com (Rick Holzgrafe) writes:
  325.  
  326. > You should be aware that segments are loaded automagically the first time
  327. > any function in them is called, but they are never unloaded unless you do
  328. > so specifically in your code. This has a couple of effects. One effect is
  329. > that *any* routine can move memory if it is in an unloaded segment when
  330. > you call it, because its segment will be loaded into your heap before the
  331.  
  332. Another "effect" is that it can FAIL to load if there isn't room in the
  333. heap for the segment. This can be bad news to your users. If you ignore
  334. this fact, and the segment fails to load, your code had better handle
  335. this fact. But handling the failure is a pain in the @#$@. How many
  336. apps can you name that handle low memory situations reliably?
  337.  
  338. My suggestion would be to use a modern application framework that hides
  339. the ugly details of segmentation loading/unloading and follow the
  340. advice others have given on segmenting your code. MacApp maintains a
  341. reserve in order to insure that there is always going to be memory
  342. available for that code segments to be loaded and could be used as an
  343. example if you want to "roll your own".
  344.  
  345. -Robert Currey
  346.  
  347. ---------------------------
  348.  
  349. >From mdaw@alias.com (Matt Daw)
  350. Subject: Plug-Ins w- CFM
  351. Date: Wed, 16 Nov 1994 03:50:10 GMT
  352. Organization: Alias Research Inc.
  353.  
  354. Has anybody implemented a way to do plug-ins (ala PhotoShop) with the Code
  355. Fragment Manager? If so, what is the best way of doing this?
  356.  
  357. - ---------------------
  358. | Matt Daw            |
  359. | Alias Research Inc. |
  360. - ---------------------
  361.  
  362. +++++++++++++++++++++++++++
  363.  
  364. >From h+@metrowerks.com (Jon W{tte)
  365. Date: Sat, 19 Nov 1994 15:40:34 +0100
  366. Organization: The Conspiracy
  367.  
  368. In article <mdaw-1511942250100001@192.75.21.44>,
  369. mdaw@alias.com (Matt Daw) wrote:
  370.  
  371. >Has anybody implemented a way to do plug-ins (ala PhotoShop) with the Code
  372. >Fragment Manager? If so, what is the best way of doing this?
  373.  
  374. It's REALLY easy. You just load the fragment from disk, and get 
  375. the value of the symbol you want (like "main") and call it as a 
  376. function pointer. NO PAIN!
  377.  
  378. Unless you're on the 68K, in which case it's #$GUffaw
  379.  
  380. <What was that?>
  381. <The manager for the CFM 68K, tiring of the flames and 
  382. putting them out>
  383. <Oh!>
  384.  
  385. Cheers,
  386.  
  387.                     / h+
  388.  
  389.  
  390. --
  391.   Jon Wätte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  392.   "Psychotherapist" - "Psycho-The-Rapist"
  393.    Pure coincidence? You decide!
  394.  
  395.  
  396. ---------------------------
  397.  
  398. >From andy@dijkstra.cs.clemson.edu (Andrew Greenshields)
  399. Subject: Saving a PICT to a file - how?
  400. Date: 16 Nov 1994 00:43:29 GMT
  401. Organization: Clemson University
  402.  
  403.  
  404.   I have finally got my text file to convert to a nice infra-red image
  405. which I now have in the format of a PICT.  However, when I try to save
  406. this PICT as a file I am running into trouble.  I am using
  407. GetHandleSize to find out how big the PICT is and then I am using
  408. SFWrite to write the data to a file.  I am using *thePict as the
  409. pointer to the data, where thePict is of type PicHandle.  When I try
  410. and look at this file using Photoshop it tells me there is a problem
  411. reading this file.  What am I doing wrong?
  412.  
  413.   Any help would be greatly appreciated.
  414.  
  415.  
  416. Thanks in advance,
  417.  
  418. Andy
  419.  
  420. -- 
  421.   Andrew J. Greenshields N3IGS    |  Some people can tell what time it is by
  422.   andy@cs.clemson.edu             |  looking at the Sun, but I have never been
  423.   USPA C-24393                    |  able to make out the numbers.
  424. - ---------------------***STANDARD DISCLAIMERS APPLY***------------------------
  425.  
  426. +++++++++++++++++++++++++++
  427.  
  428. >From blm@coho.halcyon.com (Brian L. Matthews)
  429. Date: 16 Nov 1994 18:14:08 GMT
  430. Organization: NWNEXUS, Inc. - Making Internet Easy
  431.  
  432. In article <3abkjh$5jm@hubcap.clemson.edu>,
  433. Andrew Greenshields <andy@dijkstra.cs.clemson.edu> wrote:
  434. | I am using GetHandleSize to find out how big the PICT is and then I
  435. |am using SFWrite to write the data to a file.
  436.  
  437. A PICT file starts with a 512-byte header before the actual PICT data.
  438. This header is for use by applications, and as far as I know, there aren't
  439. any standards for what goes in there, except one.  If it's all zeroes,
  440. you're fine.  So, before calling FSWrite to put the picture data in the
  441. file, do a:
  442.  
  443.     err = SetFPos (fRefNum, 1, 512);
  444.  
  445. If you've just created the file, this will effectively put 512 0s at
  446. the start of the file.  Note that if you're writing to an existing file,
  447. you may actually have to do an FSWrite of 512 0s to ensure they're there.
  448.  
  449. Brian
  450. --
  451. Brian L. Matthews                    blm@halcyon.com
  452.   "Look past the ghost that hides Hell's treasures." -Sky Cries Mary
  453.  
  454. +++++++++++++++++++++++++++
  455.  
  456. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  457. Date: 17 Nov 94 16:59:07 +1300
  458. Organization: University of Waikato, Hamilton, New Zealand
  459.  
  460. In article <3adi5g$qed@news.halcyon.com>, blm@coho.halcyon.com (Brian L. Matthews) writes:
  461. >
  462. > A PICT file starts with a 512-byte header before the actual PICT data.
  463. > This header is for use by applications, and as far as I know, there aren't
  464. > any standards for what goes in there, except one.  If it's all zeroes,
  465. > you're fine.  So, before calling FSWrite to put the picture data in the
  466. > file, do a:
  467. >
  468. >     err = SetFPos (fRefNum, 1, 512);
  469. >
  470. > If you've just created the file, this will effectively put 512 0s at
  471. > the start of the file.
  472.  
  473. No, it will not. You must explicitly write 512 bytes of zeroes in all cases.
  474.  
  475. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  476. Computer Services Dept                     fax: +64-7-838-4066
  477. University of Waikato            electric mail: ldo@waikato.ac.nz
  478. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+13:00
  479.  
  480. +++++++++++++++++++++++++++
  481.  
  482. >From blm@chinook.halcyon.com (Brian L. Matthews)
  483. Date: 17 Nov 1994 18:26:54 GMT
  484. Organization: NWNEXUS, Inc. - Making Internet Easy
  485.  
  486. In article <1994Nov17.165907.35371@waikato.ac.nz>,
  487. Lawrence D'Oliveiro, Waikato University <ldo@waikato.ac.nz> wrote:
  488. |>     err = SetFPos (fRefNum, 1, 512);
  489. |> If you've just created the file, this will effectively put 512 0s at
  490. |> the start of the file.
  491. |No, it will not. You must explicitly write 512 bytes of zeroes in all cases.
  492.  
  493. Argh.  Lawrence is, of course, absolutely right.  I always seem to get
  494. Unix and the Mac confused in cases like this.  Anyway, I was actually
  495. wrong twice.  First, SetFPos will fail if you attempt to set the file
  496. position beyond the end of file.  And second, if you use SetEOF before
  497. the SetFPos, it doesn't fill with 0s.  So while I was right about needing
  498. the 512 0s, I screwed up how to get them there. :-)
  499.  
  500. Brian
  501. --
  502. Brian L. Matthews                    blm@halcyon.com
  503.   "Look past the ghost that hides Hell's treasures." -Sky Cries Mary
  504.  
  505. +++++++++++++++++++++++++++
  506.  
  507. >From andy@dijkstra.cs.clemson.edu (Andrew Greenshields)
  508. Date: 18 Nov 1994 01:32:04 GMT
  509. Organization: Clemson University
  510.  
  511. In article <3ag79e$2vj@news.halcyon.com> blm@chinook.halcyon.com (Brian L. Matthews) writes:
  512. >In article <1994Nov17.165907.35371@waikato.ac.nz>,
  513. >Lawrence D'Oliveiro, Waikato University <ldo@waikato.ac.nz> wrote:
  514.  
  515.   Thankyou both, I can now successfully save my PICTs to files!
  516.  
  517. Andy
  518.  
  519.  
  520. -- 
  521.   Andrew J. Greenshields N3IGS    |  Some people can tell what time it is by
  522.   andy@cs.clemson.edu             |  looking at the Sun, but I have never been
  523.   USPA C-24393                    |  able to make out the numbers.
  524. - ---------------------***STANDARD DISCLAIMERS APPLY***------------------------
  525.  
  526. +++++++++++++++++++++++++++
  527.  
  528. >From rollin@newton.apple.com (Keith Rollin)
  529. Date: Sun, 20 Nov 1994 22:56:08 -0800
  530. Organization: Apple ][ -> Mac -> Taligent -> Newton -> Windows?
  531.  
  532. In article <3abkjh$5jm@hubcap.clemson.edu>, andy@dijkstra.cs.clemson.edu
  533. (Andrew Greenshields) wrote:
  534.  
  535. >  I have finally got my text file to convert to a nice infra-red image
  536. >which I now have in the format of a PICT.  However, when I try to save
  537. >this PICT as a file I am running into trouble.  I am using
  538. >GetHandleSize to find out how big the PICT is and then I am using
  539. >SFWrite to write the data to a file.  I am using *thePict as the
  540. >pointer to the data, where thePict is of type PicHandle.  When I try
  541. >and look at this file using Photoshop it tells me there is a problem
  542. >reading this file.  What am I doing wrong?
  543.  
  544. PICT files begin with a 512 byte header (documented in an old Technote and
  545. in NIM:Imaging with QuickDraw). You don't mention that you are providing
  546. for this header, so that might be your problem.
  547.  
  548. The 512 byte header is for application-defined purposes. If you don't need
  549. to use it, you should clear it out (set it to zero) so as not to confuse
  550. another application that may try interpreting it.
  551.  
  552. - --------------------------------------------------------------------------
  553. Keith Rollin --- Phantom Programmer --- Apple Computer, Inc. --- Team Newton
  554. "I say, let's write "wacko" on all the rocks and be done with it."
  555.  
  556. ---------------------------
  557.  
  558. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  559. Subject: Sprite Animation Toolkit 2.3a1
  560. Date: 19 Nov 1994 18:12:06 GMT
  561. Organization: (none)
  562.  
  563. Sprite Animation Toolkit 2.3, alpha version 1, is now available by
  564. ftp from ftp.uu.net, in the /tmp directory, as sat23a1.hqx. It will
  565. probably not remain there for more than a week.
  566.  
  567. Sprite Animation Toolkit is a programming library for making sprite-based
  568. animations (e.g. games). It includes a large number of demos, ranging from
  569. trivially simple to a complete game. It has been used for producing over
  570. a dozen released games.
  571.  
  572. This version works with CodeWarrior (Pascal or C, not PPC yet) as well
  573. as the Think compilers. (Not MPW. Sorry.) Several new features have been
  574. added, and a few changes have been made to make it faster, use less
  575. memory and be more foolproof.
  576.  
  577. This is an alpha version. It is not thoroughly tested. All demos work just
  578. fine on all systems I have been able to try them on, but I need help to find
  579. out if there are any serious bugs left.
  580.  
  581. --
  582. - -
  583. Ingemar Ragnemalm, PhD
  584. Image processing, Mac shareware games
  585. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  586.  
  587. ---------------------------
  588.  
  589. >From D_Gladstone@cs.auckland.ac.nz (David Gladstone)
  590. Subject: UPP's & calling completion procs
  591. Date: Thu, 17 Nov 1994 08:55:53 +1200
  592. Organization: University of Auckland, New Zealand.
  593.  
  594.  
  595. Hi.  I have been having some conceptual problems with UPPs.  I am writing
  596. a Catalog Service Access Module driver which needs to call a completion
  597. routine.
  598.  
  599. I have been getting confused about how things work (especially with CFM68K
  600. on the horizon).  I wrote the following initially as a series of questions
  601. and (as is often the case) managed to find plausible answers just by trying
  602. to phrase the questions - so I have stated what I understand instead.  How
  603. accurate is my version of the story below.  It has been a while since I read
  604. develop 17 (16?) "Making the Leap to PowerPC"...
  605.  
  606.  
  607. The way I figure it, there are several situations that could occur at runtime
  608. for my driver:
  609.  
  610. 1. I am 68K code and the completion routine field is a ProcPtr
  611. 2. I am 68K code and the completion routine field is a UPP (either PPC or 68K
  612.    code fragment)
  613. 3. I am PPC code and the completion routine field is a UPP (either PPC or 68K
  614.    code fragment)
  615. 4. I am PPC code and the completion routine field is a ProcPtr (from a 68K,
  616.    non CFM68K app)
  617.    
  618.  
  619. Case 1 would occur when we are running on a PPC in emulation or on a 68K
  620. machine and an old piece of software calls me.  Since my code is 68K and
  621. I don't have CFM68K at my disposal the only option I have is to call
  622. the routine as if it were a ProcPtr (which is fine in this case).
  623.  
  624.  
  625. Case 2 would occur when a 68K version of the driver is running in emulation
  626. on a PPC or it is running on a 68K machine with CFM68K installed.
  627.  
  628. It would not be so difficult if CFM68K existed - I could use it to dispatch
  629. all UPP calls and it would determine whether the pointer was a real UPP or
  630. not.  However, without using CFM68K for the 68K version of the driver I 
  631. have to call any value in the completion routine field of the parameter
  632. block as if it were a ProcPtr.  This means that I will be jumping to the
  633. routine descriptor rather than the routine itself.  I presume that
  634. NewRoutineDescriptor() must put 68K code at the beginning of all routine
  635. descriptors to handle this.
  636.  
  637.  
  638.  
  639. Case 3 would occur when a PPC version of the driver is called by a CFM
  640. aware 68K or PPC app.
  641.  
  642. In this case just call CallUniversalProc to dispatch the call.
  643.  
  644.  
  645.  
  646. Case 4 would occur when a PPC version of the driver is called by an old 
  647. non-CFM68K application.
  648.  
  649. This must be handled by the Code Fragment Manager.  If you call
  650. CallUniversalProc with a ProcPtr it figures out that the address in 
  651. memory is not a routine descriptor and therefore should execute it as
  652. 68K code.
  653.  
  654.  
  655.  
  656.  
  657.  
  658. Is it really that simple?
  659.  
  660.  
  661. David Gladstone.
  662.  
  663. _________________________________________________________________________
  664. David Gladstone : Computer Science Department, University of Auckland, NZ
  665. david@cs.auckland.ac.nz : Ph. +64 9 373-7599 x 5336 : Fax: +64 9 373-7453
  666. _________________________________________________________________________
  667.                       "Give blood... Play Hockey." 
  668.  
  669.  
  670. +++++++++++++++++++++++++++
  671.  
  672. >From Jaeger@fquest.com (Brian Stern)
  673. Date: 17 Nov 1994 05:03:19 GMT
  674. Organization: The University of Texas at Austin, Austin, Texas
  675.  
  676. In article <D_Gladstone-1711940855530001@david.cs.aukuni.ac.nz>,
  677. D_Gladstone@cs.auckland.ac.nz wrote:
  678.  
  679. < Hi.  I have been having some conceptual problems with UPPs.  I am writing
  680. < a Catalog Service Access Module driver which needs to call a completion
  681. < routine.
  682.  
  683.   I presume that
  684. < NewRoutineDescriptor() must put 68K code at the beginning of all routine
  685. < descriptors to handle this.
  686.  
  687. Not Exactly.  If you're on a PowerMac, drop into macsBug and type 'il
  688. CopyBits'.  CopyBits is native.  What you'll see looks something like
  689. this:
  690.  
  691.             000C12AC   TB         E                 | AAFE
  692.             000C12AE   BTST       D3,D0             | 0700
  693.             000C12B0   ORI.B      #$00,D0           | 0000 0000
  694.             000C12B4   ORI.B      #$00,D0           | 0000 0000
  695.             000C12B8   ORI.B      #$BFC0,D3         | 0003 BFC0
  696.             000C12BC   ORI.B      #$04,D1           | 0001 0004
  697.             000C12C0   ORI.B      #$2C10,A3         | 000B 2C10
  698.             000C12C4   ORI.B      #$00,D0           | 0000 0000
  699.             000C12C8   ORI.B      #$00,D0           | 0000 0000
  700.             000C12CC   ORI.B      #$A8EF,D0         | 0000 A8EF
  701.  
  702. What you're looking at is the routine descriptor for Copybits.  Notice
  703. that the first word is AAFE.  That's the mixedmodemagic trap.  So when you
  704. call copybits you're actually jumping to the mixedmodemagic trap.  It
  705. knows the location of the rest of the routine descriptor and gets the
  706. information that it needs to jump to the appropriate code in the
  707. appropriate mode.
  708.  
  709. < Is it really that simple?
  710.  
  711. Pretty much.
  712. If you're 68K then all you know about are procptrs.  If you're PPC then
  713. you MUST use CallUniversalProc.  CallUniversalProc works correctly if the
  714. code it's pointing to is a routine descriptor or is 68K code.
  715.  
  716. < David Gladstone.
  717. < _________________________________________________________________________
  718. < David Gladstone : Computer Science Department, University of Auckland, NZ
  719. < david@cs.auckland.ac.nz : Ph. +64 9 373-7599 x 5336 : Fax: +64 9 373-7453
  720. < _________________________________________________________________________
  721. <                       "Give blood... Play Hockey."
  722.  
  723. -- 
  724. Brian  Stern  :-{)}
  725. Toolbox commando and Menu bard
  726. Jaeger@fquest.com
  727.  
  728. +++++++++++++++++++++++++++
  729.  
  730. >From wdh@fresh.com (Bill Hofmann)
  731. Date: Thu, 17 Nov 1994 17:54:50 GMT
  732. Organization: Fresh Software
  733.  
  734. In article <D_Gladstone-1711940855530001@david.cs.aukuni.ac.nz>,
  735. D_Gladstone@cs.auckland.ac.nz wrote:
  736. >....
  737. > The way I figure it, there are several situations that could occur at runtime
  738. > for my driver:
  739. > 1. I am 68K code and the completion routine field is a ProcPtr
  740. > 2. I am 68K code and the completion routine field is a UPP (either PPC or 68K
  741. >    code fragment)
  742. > 3. I am PPC code and the completion routine field is a UPP (either PPC or 68K
  743. >    code fragment)
  744. > 4. I am PPC code and the completion routine field is a ProcPtr (from a 68K,
  745. >    non CFM68K app)
  746. >....
  747. > Is it really that simple?
  748. Yes, it is.  Look at almost any header.  The proper way to call the
  749. completion proc is to define a set of macros (I bet they're already
  750. defined for CSAMs):
  751. #if ROUTINEDESCRIPTORS
  752. #define CallCSAMCompletionProc(proc, foo, bar)    \
  753.         CallUniversalProc(proc, uppCSAMCompletionProcInfo, (foo), (bar))
  754. #else
  755. #define CallCSAMCompletionProc(proc, foo, bar)     \
  756.         ((proc)((foo), (bar))
  757. #endif
  758. like so, look for more detail in any header.  Just use CallCSAMCompletionProc()
  759. in your code.
  760.  
  761. -Bill
  762.  
  763. -- 
  764. Bill Hofmann                                  wdh@fresh.com
  765. Fresh Software and Instructional Design       voice: +1 510 524 0852
  766. 1640 San Pablo Ave #C, Berkeley CA 94702 USA  fax:   +1 510 524 0853
  767.  
  768. +++++++++++++++++++++++++++
  769.  
  770. >From h+@metrowerks.com (Jon W{tte)
  771. Date: Fri, 18 Nov 1994 09:26:57 +0100
  772. Organization: The Conspiracy
  773.  
  774. In article <D_Gladstone-1711940855530001@david.cs.aukuni.ac.nz>,
  775. D_Gladstone@cs.auckland.ac.nz (David Gladstone) wrote:
  776.  
  777. >1. I am 68K code and the completion routine field is a ProcPtr
  778. >2. I am 68K code and the completion routine field is a UPP (either PPC or 68K
  779. >   code fragment)
  780.  
  781. Here, just blithely jump to the address. Things will work, 
  782. because the 68K code in the UPP includes the _MixedModeMagic 
  783. trap.
  784.  
  785. >3. I am PPC code and the completion routine field is a UPP (either PPC or 68K
  786. >   code fragment)
  787. >4. I am PPC code and the completion routine field is a ProcPtr (from a 68K,
  788. >   non CFM68K app)
  789.  
  790. If the API says this is now a UPP field, then you have to call 
  791. through with CallXXX() which will make sure that everything 
  792. works.
  793.  
  794. However, the way that the 68K CFM works (totally new glue 
  795. libraries; can't use old headers) and PPC emulation works, the 
  796. 68K CFM model will look just like the PPC model, i e do what 
  797. you'd do on the PPC and you will be fine.
  798.  
  799. That there is no architecture for CFM driver (and even less for 
  800. PPC drivers) probably has something to do with it as well. 
  801. Safest bet would be to write it in plain, non-CFM 68K code 
  802. until the new driver architecture rolls around.
  803.  
  804. Cheers,
  805.  
  806.                     / h+
  807.  
  808.  
  809. --
  810.   Jon Wätte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  811.  
  812. "When I started hacking, we didn’t have ones. We had to make do with zeros."
  813.     — Overheard by Andrew Craze
  814.  
  815.  
  816. +++++++++++++++++++++++++++
  817.  
  818. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  819. Date: Sat, 19 Nov 1994 01:43:04 +1300 (NZDT)
  820. Organization: (none)
  821.  
  822. Jaeger@fquest.com (Brian Stern) writes:
  823. >   I presume that
  824. > < NewRoutineDescriptor() must put 68K code at the beginning of all routine
  825. > < descriptors to handle this.
  826. > Not Exactly.  If you're on a PowerMac, drop into macsBug and type 'il
  827. > CopyBits'.  CopyBits is native.  What you'll see looks something like
  828. > this:
  829. >             000C12AC   TB         E                 | AAFE
  830. >             000C12AE   BTST       D3,D0             | 0700
  831. >             000C12B0   ORI.B      #$00,D0           | 0000 0000
  832. >             000C12B4   ORI.B      #$00,D0           | 0000 0000
  833. >             000C12B8   ORI.B      #$BFC0,D3         | 0003 BFC0
  834. >             000C12BC   ORI.B      #$04,D1           | 0001 0004
  835. >             000C12C0   ORI.B      #$2C10,A3         | 000B 2C10
  836. >             000C12C4   ORI.B      #$00,D0           | 0000 0000
  837. >             000C12C8   ORI.B      #$00,D0           | 0000 0000
  838. >             000C12CC   ORI.B      #$A8EF,D0         | 0000 A8EF
  839. > What you're looking at is the routine descriptor for Copybits.  Notice
  840. > that the first word is AAFE.  That's the mixedmodemagic trap.  So when you
  841. > call copybits you're actually jumping to the mixedmodemagic trap.  It
  842. > knows the location of the rest of the routine descriptor and gets the
  843. > information that it needs to jump to the appropriate code in the
  844. > appropriate mode.
  845.  
  846. You're running an old version of Macsbug.  My 6100 says:
  847.  
  848.             000B6FAC   _MixedModeMagic                       ; AAFE       | AAFE
  849.             000B6FAE   BTST       D3,D0                                   | 0700
  850.             000B6FB0   ORI.B      #$00,D0                                 | 0000 0000
  851.             000B6FB4   ORI.B      #$00,D0                                 | 0000 0000
  852.             000B6FB8   ORI.B      #$BFC0,D3                               | 0003 BFC0
  853.             000B6FBC   ORI.B      #$04,D1                                 | 0001 0004
  854.             000B6FC0   ORI.B      #$8A60,A2                  ; '`'        | 000A 8A60
  855.             000B6FC4   ORI.B      #$00,D0                                 | 0000 0000
  856.             000B6FC8   ORI.B      #$00,D0                                 | 0000 0000
  857.             000B6FCC   ORI.B      #$A8EF,D0                               | 0000 A8EF
  858.  
  859. -- Bruce
  860.  
  861.  
  862.  
  863.  
  864. ---------------------------
  865.  
  866. End of C.S.M.P. Digest
  867. **********************
  868.  
  869.  
  870.  
  871.